﻿namespace Digitalmes.Application.Mes;

/// <summary>
///  SN 流转状态
/// </summary>
public sealed class ProdTransSnDto : Dto
{
    /// <summary>
    /// SN
    /// </summary>
    public string? Sn { get; set; }

    /// <summary>
    /// 产品 Id
    /// </summary>
    public long ProductId { get; set; }

    /// <summary>
    /// 产品代码
    /// </summary>
    public string? ProductCode { get; set; }

    /// <summary>
    /// 工单号
    /// </summary>
    public string? Wo { get; set; }

    /// <summary>
    /// 当前所在的产线 Id。
    /// </summary>
    public long CurLineId { get; set; }

    /// <summary>
    /// 当前所在的产线编号
    /// </summary>
    public string? CurLineCode { get; set; }

    /// <summary>
    /// 当前所在的工位 Id。
    /// </summary>
    public long CurOpId { get; set; }

    /// <summary>
    /// 当前所在的工位编号
    /// </summary>
    public string? CurOpCode { get; set; }

    /// <summary>
    /// 当前所在的工序 Id。没有则为 0。
    /// </summary>
    /// <remarks>线外站时设置为 0.</remarks>
    public long CurProcId { get; set; }

    /// <summary>
    /// 当前所在的工序编号
    /// </summary>
    public string? CurProcCode { get; set; }

    /// <summary>
    /// 当前所在的工艺路线 Id。没有则为 0。
    /// </summary>
    /// <remarks>线外站时设置为 0。</remarks>
    public long CurRoutingId { get; set; }

    /// <summary>
    /// 当前所在的工艺路线编号
    /// </summary>
    public string? CurRoutingCode { get; set; }

    /// <summary>
    /// 产品在当前工位进站时间
    /// </summary>
    public DateTime InboundTime { get; set; }

    /// <summary>
    /// 产品在当前工位出站时间
    /// </summary>
    public DateTime? OutboundTime { get; set; }

    /// <summary>
    /// 产品上线时间
    /// </summary>
    /// <remarks>根据工艺路线，起始工位进站时间</remarks>
    public DateTime OnlineTime { get; set; }

    /// <summary>
    /// 产品下线时间
    /// </summary>
    /// <remarks>根据工艺路线，末尾工位出站时间，若是 NG 或报废，更加具体情况设置</remarks>
    public DateTime? OfflineTime { get; set; }

    /// <summary>
    /// 产品当前工作阶段（进站/出站）
    /// </summary>
    public SnStageEnum Stage { get; set; }

    public string? StageDesc => Stage.Description();

    /// <summary>
    /// 产品当前状态。
    /// </summary>
    /// <remarks>产品 NG 后经过返修，同时也会修改对应状态。</remarks>
    public SnStatusEnum Status { get; set; }

    public string? StatusDesc => Status.Description();

    /// <summary>
    /// 是否已完工下线。
    /// </summary>
    /// <remarks>
    /// 若是已在工艺路线中的尾部工位且 OK 下件，即为完工状态。
    /// 或是人为设置为完工状态，如返修后不再上线。
    /// </remarks>
    public bool IsCompelted { get; set; }

    /// <summary>
    /// 客户SN
    /// </summary>
    public string? CustomerSn { get; set; }

    /// <summary>
    /// 返工标识
    /// </summary>
    public ReworkFlagEnum ReworkFlag { get; set; }

    public string? ReworkFlagDesc => ReworkFlag.Description();

    /// <summary>
    /// 最近的返工单据，不存在则为空。
    /// </summary>
    public string? ReworkDoc { get; set; }

    /// <summary>
    /// 已返修次数。记录该产品返修的总次数。
    /// </summary>
    public int ReworkCount { get; set; }

    /// <summary>
    /// NG 步序号集合。
    /// </summary>
    /// <remarks>若该工序有设置步序，可在 NG 时对应的步序，没有则为 null。</remarks>
    public List<int>? NgSteps { get; set; }
}
